package com.speaktoitcookbook.dao;

import java.util.List;

import com.speaktoitcookbook.bean.Cookbook;
import com.speaktoitcookbook.bean.CookbookDetail;

/**
 * 菜谱的相关操作的接口
 * 
 * @author 赛艳志
 * 
 */
public interface ICookbookDao {

    /**
     * 菜谱搜索，按更新时间获取
     */
    public static final int SORT_UPDATE = 0;

    /**
     * 菜谱搜索，按点击量获取
     */
    public static final int SORT_HIT = 1;

    /**
     * 菜谱搜索，按分享次数获取
     */
    public static final int SORT_SHARE = 2;

    /**
     * 菜谱搜索，按收藏数获取
     */
    public static final int SORT_COLLECT = 3;

    /**
     * 向数据库添加菜谱,同时会将菜谱、原料、步骤添加到数据库
     * 
     * @param cookbookDetail
     *            菜谱内容
     * @return true成功，false失败
     */
    public boolean doCreate(CookbookDetail cookbookDetail);

    /**
     * 向单个cookbook数据库表添加内容
     * 
     * @param cookbook
     *            菜谱对象
     * @return true成功，false失败
     */
    public boolean doCreate(Cookbook cookbook);

    /**
     * 删除菜谱，同时删除原料、步骤等相关信息
     * 
     * @param cookbook
     *            删除的菜谱
     * @return true成功，false失败
     */
    public boolean doDelete(Cookbook cookbook);

    /**
     * 删除菜谱，同时删除原料、步骤等相关信息
     * 
     * @param cookbookID
     *            删除的菜谱ID
     * @return true成功，false失败
     */
    public boolean doDelete(long cookbookID);

    /**
     * 更新菜谱的内容,不包括该菜谱的原料，步骤。
     * 
     * @param cookbook
     * @return true成功，false失败
     */
    public boolean doUpdate(Cookbook cookbook);

    /**
     * 菜谱被点击，点击次数加一
     * 
     * @param cookbookID
     *            菜谱ID
     * @return true成功，false失败
     */
    public boolean doHit(long cookbookID);

    /**
     * 菜谱被分享，分享次数加一
     * 
     * @param cookbookID
     *            菜谱ID
     * @return true成功，false失败
     */
    public boolean doShare(long cookbookID);

    /**
     * 获取菜谱菜谱列表,根据type类型可分别得到按点击次数、分享次数、收藏次数和更新时间排序的菜谱列表<br>
     * <b>注意：如果查找结果过多，可能会发生异常</b>
     * 
     * @param type
     *            排序类型：</br>
     *            <ol>
     *            <li>SORT_HIT 点击次数；</li>
     *            <li>SORT_SHARE 分享次数；</li>
     *            <li>SORT_COLLECT 收藏次数；</li>
     *            <li>SORT_UPDATE 更新时间</li>
     *            </ol>
     * @param start
     *            开始的位置
     * @return 菜谱集合，若未找到则为null
     */
    public List<Cookbook> getCookbook(int type, long start);

    /**
     * 使用菜谱名字搜索菜谱<br>
     * <b>注意：如果查找结果过多，可能会发生异常</b>
     * 
     * @param dishName
     *            菜谱名字
     * @param start
     *            开始的位置
     * @return 菜谱集合，若未找到则为null
     */
    public List<Cookbook> getCookbook(String dishName, long start);

    /**
     * 根据指定条件查找数据库菜谱，建议指定相关条件查询<br>
     * <b>注意：如果查找结果过多，可能会发生异常</b>
     * 
     * @param params
     *            查询条件，可为空
     *            <p>
     *            示例：
     *            <ol>
     *            <li>"where `cbID` like '%123%'"<br>
     *            将查询菜谱中包含123的菜谱</li>
     *            <li>new String[]{"where `cbID` like '%123%' ",
     *            "and `dishName` = '123'"}<br>
     *            将查询菜谱中包含123并且名字为123的菜谱</li>
     *            </ol>
     *            </p>
     * @return 菜谱集合，若未找到则为null
     */
    public List<Cookbook> getCookbook(Object... params);

    /**
     * 获取菜谱详细信息
     * 
     * @param cookbookID
     *            菜谱ID
     * @return 菜谱完整信息包括菜谱、原料、步骤，若未找到则为null
     */
    public CookbookDetail getCookbookDetail(long cookbookID);

    /**
     * 获取菜谱详细信息
     * 
     * @param cookBook
     *            菜谱ID
     * @return 菜谱完整信息包括菜谱、原料、步骤
     */
    public CookbookDetail getCookbookDetail(Cookbook cookbook);

    /**
     * 显示单个菜谱内容
     * 
     * @param cookbookID
     *            菜谱ID
     * @return true成功，false失败
     */
    public Cookbook getCookbookInfo(long cookbookID);

    /**
     * 根据指定条件查找数据库菜谱详情，建议指定相关条件查询<br>
     * <b>注意：如果查找结果过多，可能会发生异常</b>
     * 
     * @param params
     *            查询条件，可为空
     *            <p>
     *            示例：
     *            <ol>
     *            <li>"where `cbID` like '%123%'"<br>
     *            将查询菜谱中包含123的菜谱详情</li>
     *            <li>new String[]{"where `cbID` like '%123%' ",
     *            "and `dishName` = '123'"}<br>
     *            将查询菜谱中包含123并且名字为123的菜谱详情</li>
     *            </ol>
     *            </p>
     * @return 菜谱详情集合，若未找到则为null
     */
    public List<CookbookDetail> getCookbookDetail(Object... params);

    /**
     * 查找新数据库中菜谱数，可以指明相关查找条件
     * 
     * @param params
     *            <p>
     *            示例：
     *            <ol>
     *            <li>"where `cbID` like '%123%'"<br>
     *            将查询菜谱中包含123的菜谱数</li>
     *            <li>new String[]{"where `cbID` like '%123%' ",
     *            "and `dishName` = '123'"}<br>
     *            将查询菜谱中包含123并且名字为123的菜谱数</li>
     *            </ol>
     *            </p>
     * @return 相关菜谱数
     */
    public long getCookbookCount(Object... params);
}
